﻿#ifndef DATAFILEDST_H
#define DATAFILEDST_H

#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>

#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include "datafile/dataoperat.h"

#define DATAFACTOR 10 //dst绝对坐标数据转换为ds16前需要扩大10倍

#define DST_EMB_DATADIRX    (-1)     // X向数据坐标与下位机坐标系统的差异
#define DST_EMB_DATADIRY    (1)     // Y向数据坐标与下位机坐标系统的差异

#define DST_SHOWDIRX    (-1)     // X向显示坐标和数据坐标的差异
#define DST_SHOWDIRY    (1)     // Y向显示坐标和数据坐标的差异

#define DST_PREVIEW_SIDE    (15)     // 留边大小
#define DST_PREVIEW_WIDTH   (156)   // 默认预览图区域宽度
#define DST_PREVIEW_HEIGHT  (164)   // 默认预览图区域高度

// dst文件头
#pragma pack(1)//设定为1字节对齐
struct DstHead
{
// 0
    char la[20];
    char st[11];
    char co[7];
    char xp[9];
    char xn[9];
    char yp[9];
    char yn[9];
    char ax[10];
    char ay[10];
    char mx[10];
    char my[10];
    char pd[10];
    char sub;
    char reserved1[3];

// 128
    u8 rotateStyle;             //旋转式样
    u8 horizontalStyle;      //水平翻转式样
    u8 verticalStyle;           //垂直翻转式样
    u8 rotateAngle;           //旋转角度
    u8 reinMode;              //加固方式
    u8 reinNeedles;          //针数
    u8 reinNum;                //次数
    s16 normalStep;          //针步大小
    s16 angleCorrOffset;   //角度修正量
    s16 angleCorrPosX;    //角度修正量X正
    s16 angleCorrPosY;    //角度修正量Y正
    s16 angleCorrNegX;   //角度修正量X负
    s16 angleCorrNegY;   //角度修正量Y负
    int scanX;                     //X向宽度
    int scanY;                     //Y向高度
    int left;                        //左边
    int front;                     //前边

 // 163
    //u8 reserved2[256-163]; //BYTE
    u8 cornerneedle;        //0x163 拐角增加针步标志
    u8 cutneedle;           //0x164 拐角分割针步标志
    u8 reserved2[256-165]; //BYTE

// 256
    s16  reserved3;

// 258
    int  anchorX; //定位点
    int  anchorY;

// 266
    s32  startX; //起始点
    s32  startY;

// 274
    u8 reserved4[512-274];	//BYTE	// 保留字节
};
#pragma pack(1)//恢复对齐状态


// 针步数据
typedef struct strDstStep
{
    u8 c1;	////BYTE
    u8 c2;	////BYTE
    u8 c3;	////BYTE
}__attribute__ ((packed)) DstStep;


class DataFileDst
{
public:
    DataFileDst();
    ~DataFileDst();

public:
    void initFile(const QString & fullPathName);
    int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0);  // 生成预览文件
    void convertDataToAbs();     // 转换为绝对坐标数据
    void writePointToFile(int x, int y, int flag = 0);//写入起始点到文件中
    void writePatternParaToFile(DstHead *head);//将花样参数配置写到文件中
    void writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY);
    int checkDstFile();//检查dst文件是否正确
    DstHead * getDstHead();
    void moveDataBeginPonit(s32 left, s32 front);//移动数据起始点

public:
    void clear();
    void loadFile();
    void saveFile();
    inline const QString & getFileFullPathName() const {return m_fileFullPathName;}   // 文件路径名称
    inline QByteArray & getFileData() {return m_fileData;}         // 得到文件数据
    inline QByteArray & getEmbAbsData() {return m_embAbsData;}           // 得到转换后的数据
    QString getFileFullPath();      // 文件所在目录
    QString getFileFullName();      // 文件名称（包括扩展名）
    QString getFileName();          // 文件名称（不包括扩展名）
    QString getFileSuffix();        // 文件扩展名

    int getStitchNums();//得到数据的针数
    int getFileid();//得到fileid
    int getDatWidth();//得到数据的图形宽度
    int getDatHeight();//得到数据的图形高度
    int getMaxX();//得到数据最大X+
    int getMinX();//得到数据最小X-
    int getMaxY();//得到数据最大Y+
    int getMinY();//得到数据最小Y-
    int getBeginXYAndAnchorXY(int &beginX, int &beginY, int &anchorX, int &anchorY);

protected:
    QString m_fileFullPathName; // 文件路径
    QByteArray m_embAbsData;    // 转换后的绝对坐标数据

private:
    QByteArray m_fileData;// 文件数据内容（原始数据）
    QString m_fileName; // 文件路径

private:
    double m_minX;
    double m_maxX;
    double m_minY;
    double m_maxY;

private:
    int changeDstStep(DstStep * pDststep, Ds4Item & ds4step);

};

#endif // DATAFILEDST_H
